#include <cstddef>
#include <iostream>
using namespace std;
// // 交换的是整数
// void mySwapInt(int* left, int* right) {
//     int temp = *left;
//     *left = *right;
//     *right = temp;
// }
// // 交换的是浮点数
// void mySwapDouble(double* left, double* right) {
//     double temp = *left;
//     *left = *right;
//     *right = temp;
// }

// namespace xywl {
//     template<class T, size_t N = 10> 
//     class array {
//         public:
//             size_t size() const {
//                 return N;
//             }
//         private:
//             T _array[N];
//     };
// }
// int main() {
//     xywl::array<int, 20> a;
//     cout << a.size() << endl;
//     return 0;
// }

// template <class T>
// bool Less(T left, T right) {
//     return left < right;
// }
// template<> 
// bool Less<Date*>(Date* left, Date* right) {
//     return *left < *right;
// }
// bool Less(Date* left, Date* right) {
//     return *left < *right;
// }
// int main() {
//     cout << Less(1, 2) << endl; // 可以比较且结果正确
//     Date d1(2025, 9, 25);
//     Date d2(2025, 10, 1);
//     cout << Less(d1, d2) << endl; // 可以比较且结果正确
//     Date* p1 = &d1;
//     Date* p2 = &d2;
//     cout << Less(p1, p2) << endl; // 可以比较但结果错误
//     return 0;
// }

// template<class T1, class T2>
// class Date {
//     public:
//         Date() {
//             cout << "Date<T1, T2>" << endl;
//         }
//     private:
//         T1 _d1;
//         T1 _d2;
// };
// template<>
// class Date<int, char>
// {
//     public:
//         Date() {
//             cout << "Date<int, char>" << endl;
//         }
//     private:
//         int _d1;
//         char _d2;
// };

template <class T1, class T2>
class Date {
    public:
        Date() {
            cout << "Date<T1, T2>" << endl;
        }
    private:
        T1 _d1;
        T2 _d2;
};

template <class T1>
class Date<T1, int>
{
    public:
        Date() {
            cout << "Date<T1, int>" << endl;
        }
    private:
        T1 _d1;
        int _d2;
};

template <class T1, class T2>
class Date<T1*, T2*>
{
    public:
        Date() {
            cout << "Date<T1*, T2*>" << endl;
        }
    private:
        T1 _d1;
        T2 _d2;
};

template <class T1, class T2>
class Date<T1&, T2&>
{
    public:
        Date() {
            cout << "Date<T1&, T2&>" << endl;
        }
    private:
        T1 _d1;
        T2 _d2;
};
int main() {
    Date<int*, int*> d1;
    Date<int&, int&> d2;
    return 0;
}